package org.spark

import org.apache.spark.{SparkConf, SparkContext}

object HiSpark {

  def main(args: Array[String]): Unit = {
     /*spark   RDD  =》 spark  计算框架 (分布式实时计算技术)
     * RDD 数据类型 （全称：Resilient Distributed Dataset）  弹性分布式数据集
     * 弹性： 容错性&可恢复性  计算逻辑：可以很长也可以很短
     * 分布式： RDD分布在各个节\机器\电脑上， 分布式存储
     * 数据集： 数据类型
     *
     * 五大特性：
     * 1） 是一个分区： 计算时在分区 partition 计算
     * 2） 一个依赖列表： rdd.map().reduceByKey()  有前后依赖关系
     * 3）一个函数：  函数式编程 （匿名函数）
     * 4）可选的分区器： 分区可以选择
     * 5）位置感知调度：  对于 k-v 类型的 散列分区器， 同时RDD 所在的每个分区都被记录了其所在的节点信息
     * spark Apache
     *
     * */

    //rdd 创建
    //添加 spark—core 依赖，pom文件
    //1） rdd 通过 Driver （SparkContext）创建rdd ， array list
    //2） rdd 通过 读取文件 （hdfs，本地txt， hive 数据仓库）

    val conf = new SparkConf().setMaster("local[*]").setAppName("hiSpark")
    val sc = new SparkContext(conf)

    //array
    val arr = Array(1,2,3,4,5)
    val arrRDD = sc.parallelize(arr)

    //求和
    println(arrRDD.sum())

    //日志 info， warn ，不影响编码运行
    //error 报错
    //  fatal 影响程序运行

    // spark 语言强大的地方， 但凡写两行的代码都不是好代码
    //  词频统计
    val word = Array("hello spark","hello scala","hello java")


    //flatMap 算子，rdd 里边每一个元素 扁平化处理  （（1,1.1）） ==> (1,1.1)
    //flatMap (hello spark hello scala hello java)
    //map(hello,1) (spark,1) (hello,1).....
    //reduceByKey 按照key值聚合  （hello，3）（spark,1）.....
    //foreach  for循环遍历输出


    sc.parallelize(word).flatMap((x:String) => {x.split(" ")}).map((x:String) => {(x,1)}).reduceByKey((x:Int,y:Int) => {x+y}).foreach(println())

    //spark 函数式编程
    //-------split------
    //数据源 RDD ("hello spark","hello scala","hello java")
     //           “hello spark” split ====> (hello ,  spark)  ;; "hello scala" split ====> (hello ,  scala)
    //            ( (hello ,  spark) , (hello ,  scala) )
    // flatMap 对RDD 里面每一个元素 进行 切分压平操作  ，先进行括号里的操作   RDD( (hello ,  spark) , (hello ,  scala) )
    //           flatmap =>  RDD( hello ,  spark , hello ,  scala)
    //


    // ReduceByKey a


    //变形
    //_spark 编码 通配符


    //--------------------------spark 算子分为 两大类--------------------------------
    //  transformation 算子 无法运行出结果  flatmap(),  map(), reduceByKey()
    //  action 算子 可以出结果  foreach() , sum(),  count()
    // 特征：transformation 进行计算时，保留了计算的逻辑，没有进行结果的运算
    //      action 类型的算子， 编码只有遇到 action 类型算子才会进行计算


    /*Git 分布式 开源 代码版本管理
    * 1. 介绍
    * 2.安装
    * 3.gitee中央仓库/远程仓库
    * 4.hiScala 提交到自己的远程仓库
    *
    * 分布式：有多个节点的一个集群
    * 开源
    * 代码版本管理  方便我们回溯之前的编码
    * */

    //---------------------------Git----------------------------



  }

}
